#ifndef UTILS__H_
#define UTILS__H_
#include <iostream>
#include <string>
#include <map>

/*
 * Definicion de tipos de target utilizados por el xml
 */
#define TARGET_NAME "name"
#define TARGET_POS_X "x"
#define TARGET_POS_Y "y"
#define TARGET_TYPE "type"
#define TARGET_ID "id"
#define TARGET_VACIO "NULL"
#define TARGET_CANT_ENTRADAS "cantidadEntradas"
#define TARGET_CANT_SALIDAS "cantidadSalidas"
#define TARGET_SIZE_X "sizex"
#define TARGET_SIZE_Y "sizey"
#define TARGET_ENTITY "entidad"
#define TARGET_ATTRIBUTE "atributo"
#define TARGET_RELATION "relacion"
#define TARGET_COMPOSITEATTRIBUTE "at_compuesto"
#define TARGET_SUBDIAGRAM "diagrama"
#define TARGET_VIA "via"
#define TARGET_FORK "jerarquia"
#define TARGET_PUNTO "Punto"
#define TARGET_EXPRESSION "expression"
#define TARGET_ID_0 "id0"
#define TARGET_ID_1 "id1"
#define TARGET_ID_2 "id2"
#define TARGET_OTHER_DIAGRAM "other_diagram"

typedef enum {
	PRIVATE, PUBLIC, PROTECTED
} Visibilidad;

class Views {
public:
	std::string name;
	int id;
};

/**
 * Clase utilizada durante la persistencia para transformar
 * tipos de datos
 */
class Utils {

public:

    static const std::string representacionPrivado;
    static const std::string representacionProtegido;
    static const std::string representacionPublico;

    static std::map<Visibilidad,std::string> visivilidadEnumToString;
    static std::map<Visibilidad,std::string> crearVisivilidadEnumToString();

    static std::map<std::string,Visibilidad> visivilidadStringToEnum;
    static std::map<std::string,Visibilidad> crearVisivilidadStringToEnum();


	int convertToInt(const std::string & cadena);

	unsigned convertToUnsigned(const std::string & cadena);

	std::string convertToString(int numero);

	static std::string visibilidadToString(Visibilidad visibilidad) {
		std::string d = "";

		switch (visibilidad) {
		case PUBLIC:
			d += "+";
			break;
		case PROTECTED:
			d += "#";
			break;
		case PRIVATE:
			d += "-";
			break;
		}
		return d;
	}

	static Visibilidad visibilidadFromString(std::string s) {
		if (s.compare("+") == 0) {
			return PUBLIC;
		} else if (s.compare("-") == 0) {
			return PRIVATE;
		} else if (s.compare("#") == 0) {
			return PROTECTED;
		}
		return PRIVATE;
	}

};

#endif /* UTILS__H_ */
